package com.winner.cglib_dynamic_proxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * CGLIB动态大力是由是由第三方库cglib提供
 *
 * CGLib 全称为 Code Generation Library，是一个强大的高性能，高质量的代码生成类库，
 * 可以在运行期扩展 Java 类与实现 Java 接口，CGLib 封装了 asm，可以再运行期动态生成新
 * 的 class。和 JDK 动态代理相比较：JDK 创建代理有一个限制，就是只能为接口创建代理实例，
 * 而对于没有通过接口定义业务方法的类，则可以通过 CGLib 创建动态代理。
 */
public class TestCglibProxy {

    public static void main(final String[] args) {
        //enhancer 代理对象
        Enhancer enhancer = new Enhancer();
        //基于继承 参数是实现类的class  UserServiceImpl被代理对象
        enhancer.setSuperclass(UserServiceImpl.class);
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects,
                                    MethodProxy methodProxy) throws Throwable {
                System.out.println("开启事务...");
                Object result = methodProxy.invokeSuper(o,objects);
                System.out.println("结束事务...");
                return result;
            }
        });
        UserServiceImpl o2 = (UserServiceImpl) enhancer.create();
        System.out.println(o2.getClass()); // class com.winner.cglib_dynamic_proxy.UserServiceImpl$$EnhancerByCGLIB$$121706b1
        o2.sayHello("用Enhancer实现对UserServiceImpl的cglib代理, 对方法前后打印一句话");
    }


}
